package com.zhq.service;

import com.zhq.bean.Courier;
import com.zhq.bean.Express;
import com.zhq.bean.User;
import com.zhq.dao.BaseUserDao;
import com.zhq.dao.imp.UserDaoMysql;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @Author:钟豪强
 * @Description:    user的相关操作
 * @Date Created in  2020-08-17 15:29
 * @Modified By:
 */
public class UserService {
    private static BaseUserDao dao = new UserDaoMysql();
    /**
     * (没有像快递一样的两种数据类型,直接用map)
     * 用于查询用户表的用户数量(总数和新增)
     *
     * @return 返回{size:总数,day:新增},没有返回null
     */
    public static Map<String, Integer> console() {
        return dao.console();
    }

    /**
     * 用于查询所有用户信息
     *
     * @param limit      true代表分页,false代表不分页
     * @param offset     SQL语句分页起始索引
     * @param pageNumber 页查询页数
     * @return 返回用户信息的集合, 没有信息返回null
     */
    public static List<User> findAll(boolean limit, int offset, int pageNumber) {
        return dao.findAll(limit, offset, pageNumber);
    }

    /**
     * 根据用户手机号码查询用户信息(微信端)
     *
     * @param phoneNumber 用户号码
     * @return 返回用户信息
     */
    public static User findByPhone(String phoneNumber) {
        return dao.findByPhone(phoneNumber);
    }

    /**
     * 根据取件的数量,对用户进行排名
     *
     * @param type 0表示查询总排名,1表示年排名,2表示月排名
     * @return
     */
    public static List<User> lazyboard(int type) {
        return dao.lazyboard(type);
    }

    /**
     * 添加新用户
     *
     * @param userName   用户名
     * @param userPhone  用户手机号码
     * @param userNumber 用户身份证
     * @param password   用户密码
     * @return true代表添加成功
     */
    public static boolean insert(String userName, String userPhone, String userNumber, String password) {
        return dao.insert(userName, userPhone, userNumber, password);
    }

    /**
     * 用于根据id,修改用户信息
     *
     * @param id      用户id
     * @param newUser 新的用户信息(username,userPhone,password,userNumber)
     * @return 返回true代表修改成功
     */
    public static boolean update(int id, User newUser) {
        boolean update = dao.update(id, newUser);
        List<Express> list = ExpressService.findByUserPhone(newUser.getG_userPhone());
        List<Boolean> list1 = new ArrayList<>();
        list1.add(update);
        if (list != null) {
            for (Express e:list) {
                e.setUserPhone(newUser.getUserPhone());
                e.setG_status(-1);
                // TODO : 特殊情况,不能太短时间内重复发code,ExpressService的dao有一个只修改电话的方法
                System.out.println(e.getId());
                boolean update1 = ExpressService.update(e.getId(), e);
                list1.add(update1);
            }
            if (list1.size() == list.size()+1) {
                return true;
            }
        }
        return false;
    }

    /**
     * 用于根据id,修改用户信息
     *
     * @param id      用户id
     * @param newUser 新的用户信息(username,password,userNumber)
     * @return
     */
    public static boolean updateNotPhone(int id, User newUser) {
        return dao.updateNotPhone(id,newUser);
    }

    /**
     * 用于根据用户id,修改上一次登录时间
     *
     * @param id            用户id
     * @param lastLoginTime 上次登录的时间
     * @return true代表修改成功
     */
    public static boolean updateLastLoginTime(int id, Timestamp lastLoginTime) {
        return dao.updateLastLoginTime(id, lastLoginTime);
    }

    /**
     * 用于根据id,删除用户信息
     *
     * @param id 用户id
     * @return true代表删除成功
     */
    public static boolean delete(int id) {
        return dao.delete(id);
    }
}
